package org.batatasframework.bytecode.converte;

import org.batatasframework.bytecode.AsmMethodBody;
import org.batatasframework.bytecode.ClassAsminfo;
import org.batatasframework.bytecode.LocalVariableAsminfo;
import org.batatasframework.bytecode.PropertyAsminfo;
import org.batatasframework.bytecode.spi.AsmConvertable;
import org.springframework.asm.MethodVisitor;

/**
 * <pre>
 * 两个对象的变更进行相互的赋值转换
 * 
 * 这是最后一层需要直接赋值的对象的get/set方法
 * 
 * 在这里，需要对不同类型的数据进行有效的转换
 * </pre>
 * @author jackson
 *
 */
public class AsmPropertyConverted implements AsmConvertable{
	/** 从源这一头，赋值到 */
	private PropertyAsminfo sourceProperty;
	/** 目标这一头 */
	private PropertyAsminfo targetProperty;
	/** 在这个方法体内进行的处理 */
	private AsmMethodBody methodBody;

	@Override
	public void converte(MethodVisitor visitor, LocalVariableAsminfo localVariable){
		ClassAsminfo sourceType = sourceProperty.getType();
		ClassAsminfo targetType = targetProperty.getType();
		
		if(targetType.isAssignableFrom(sourceType)){
			/* 两个类型一致，可以直接转换的情况 */
			targetProperty.invokeSet(visitor, localVariable, sourceProperty.loadGet(localVariable));
		}
	}
}
